package com.zkq.graduate.service;

import com.zkq.graduate.pojo.StudentWithReport;
import com.zkq.graduate.util.ResultHandler;
import org.springframework.data.domain.Page;
import org.springframework.lang.Nullable;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.validation.constraints.NotNull;
import java.util.List;
import java.util.Map;
import java.util.Optional;

/**
 * @Author zhangkaiqiang
 * @Date 2019/12/12  16:43
 * @Description TODO
 */
public interface MongoDbService {

	/**
	 * 插入学生的毕业论文信息
	 * @return fileName
	 * @param file 文章详情
	 * @param request
	 */
	Map<String,String> insertStudentPaper(HttpServletRequest request, @NotNull MultipartFile file, @NotNull String flag);


	/**
	 * 查找学生最近的开题报告/毕业论文
	 * @param studentId 学生学号
	 * @param flag 开题报告还是毕业论文标识
	 * @param fields 要查询的字段
	 * @return
	 */
	 Optional<StudentWithReport> findLastStudentPaper(@NotNull String studentId, @NotNull String flag,@Nullable List<String> fields);

	/**
	 * 查找某个学生的毕业论文或者开题报告,对查找结果根据上传时间排序
	 * @return List<StudentWithReport> 查找到的文章
	 * @param findAddtion key为mongo中的字段名,value为匹配的值
	 * @param flag  open表示查找开题报告,paper表示查找毕业论文,传其他值时返回所有的记录
	 * @param fields   要查询的字段
	 */
	List<StudentWithReport> findStudentPaper(@NotNull Map<String,Object> findAddtion, @NotNull String flag,@Nullable List<String> fields);


	/**
	 *分页查找学生的开题报告
	 * @param findAddtion 查找条件
	 * @param flag
	 * @param currentPage 当前页数
	 * @param pageSize 每页几行
	 * @param fields 查询的列,为null时查询全部的列
	 * @return
	 */
	ResultHandler<Page> findStudentPaperWithPaging(
			@NotNull Map<String,Object> findAddtion,
			@NotNull String flag,
			@NotNull int currentPage,
			@NotNull int pageSize,
			@Nullable List<String> fields);

	/**
	 * 更新开题报告/毕业论文
	 * @param student  更新的数据
	 * @param updateAddtion 更新条件
	 * @param flag
	 * @return 修改的记录条数
	 */
	 int updateFileByAddition(@NotNull Map<String,Object> updateAddtion,@NotNull StudentWithReport student,@NotNull String flag);


	/**
	 * 查找符合条件的记录数
	 * @param findAddtion
	 * @param flag
	 * @return
	 */
	 long getTotal(@NotNull Map<String,Object> findAddtion, @NotNull String flag);
}
